import { PDFDocument } from "pdf-lib";

export default class PdfMergeTool {
  constructor() {
    this.pdfList = []; // 存储待合并的 PDF 源（类型：File | URL | Base64）
    this.mergedPdfUrl = null; // 合并后的 PDF 临时 URL
  }

  /**
   * 添加本地 PDF 文件
   * @param {File[]} files
   */
  addFromFiles(files) {
    if (!files || files.length === 0) return;
    Array.from(files).forEach((file) => {
      if (file.type === "application/pdf") {
        this.pdfList.push({ type: "file", data: file });
        this.updatePdfListUI();
      }
    });
  }

  /**
   * 添加远程 PDF URL
   * @param {string} url
   */
  async addFromUrl(url) {
    if (!url.trim()) return;
    try {
      // 验证 URL 是否返回 PDF
      const response = await fetch(url, { method: "HEAD" });
      if (response.headers.get("content-type") !== "application/pdf") {
        throw new Error("URL 不是有效的 PDF 文件");
      }
      this.pdfList.push({ type: "url", data: url });
      this.updatePdfListUI();
    } catch (error) {
      alert(`添加 URL 失败: ${error.message}`);
    }
  }

  /**
   * 添加 Base64 编码的 PDF
   * @param {string} base64
   */
  addFromBase64(base64) {
    if (!base64.trim()) return;
    // 检查是否是有效的 Base64 PDF（简单验证）
    if (!base64.startsWith("data:application/pdf;base64,")) {
      base64 = `data:application/pdf;base64,${base64}`;
    }
    this.pdfList.push({ type: "base64", data: base64 });
    this.updatePdfListUI();
  }

  /**
   * 合并所有 PDF 并预览
   */
  async mergeAndPreview() {
    if (this.pdfList.length === 0) {
      alert("请至少添加一个 PDF 文件！");
      return;
    }

    const mergedPdf = await PDFDocument.create();

    try {
      // 逐个加载并合并 PDF
      for (const pdfSource of this.pdfList) {
        let pdfBytes;
        switch (pdfSource.type) {
          case "file":
            pdfBytes = await pdfSource.data.arrayBuffer();
            break;
          case "url":
            const response = await fetch(pdfSource.data);
            pdfBytes = await response.arrayBuffer();
            break;
          case "base64":
            const base64Data = pdfSource.data.split(",")[1] || pdfSource.data;
            pdfBytes = Uint8Array.from(atob(base64Data), (c) =>
              c.charCodeAt(0)
            );
            break;
        }

        const pdfDoc = await PDFDocument.load(pdfBytes);
        const pages = await mergedPdf.copyPages(
          pdfDoc,
          pdfDoc.getPageIndices()
        );
        pages.forEach((page) => mergedPdf.addPage(page));
      }

      // 生成合并后的 PDF 并预览
      const mergedPdfBytes = await mergedPdf.save();
      this.mergedPdfUrl = URL.createObjectURL(
        new Blob([mergedPdfBytes], { type: "application/pdf" })
      );
    } catch (error) {
      console.error("合并 PDF 失败:", error);
      alert(`合并失败: ${error.message}`);
    }
  }

  /**
   * 渲染 PDF 预览
   * @param {string} pdfUrl
   */
  async renderPdfPreview(pdfUrl) {
    const previewElement = document.getElementById("pdf-preview");
    previewElement.innerHTML = "";

    // 方式 1：使用 iframe（简单快捷）
    const iframe = document.createElement("iframe");
    iframe.src = pdfUrl;
    iframe.width = "100%";
    iframe.height = "600px";
    previewElement.appendChild(iframe);

    // 方式 2：使用 PDF.js 逐页渲染（更灵活）
    // const pdf = await pdfjsLib.getDocument(pdfUrl).promise;
    // for (let i = 1; i <= pdf.numPages; i++) {
    //   const page = await pdf.getPage(i);
    //   const viewport = page.getViewport({ scale: 1.5 });
    //   const canvas = document.createElement('canvas');
    //   canvas.height = viewport.height;
    //   canvas.width = viewport.width;
    //   previewElement.appendChild(canvas);
    //   await page.render({ canvasContext: canvas.getContext('2d'), viewport }).promise;
    // }
  }

  /**
   * 下载合并后的 PDF
   */
  downloadMergedPdf() {
    if (!this.mergedPdfUrl) {
      alert("请先合并 PDF！");
      return;
    }
    const link = document.createElement("a");
    link.href = this.mergedPdfUrl;
    link.download = "merged.pdf";
    link.click();
  }
}
